class Solution {
    
public:
    int findCircleNum(vector<vector<int>>& isConnected) {
        // 手动并查集
        vector<int> uds(isConnected.size() , -1);   // -1表示是根
        // lambda
        auto findRoot = [&uds](int x){
            while(uds[x] >= 0)
                x = uds[x];

            return x;
        };

        // 遍历查找根
        for(size_t i = 0; i < isConnected.size(); ++i){
            for(size_t j = 0; j < isConnected[i].size(); ++j){
                if(isConnected[i][j] == 1){
                    // 合并集合
                    int root1 = findRoot(i);
                    int root2 = findRoot(j);
                    if(root1 != root2){
                        uds[root1] += uds[root2];  // 加等个数
                        uds[root2] = root1;        // 保存下标
                    }
                }
            }
        }
        int res = 0;
        for(int i : uds){
            if(i < 0) ++res;
        }
        return res;
    }
};